#include "plugin_init.h"

el::base::type::StoragePointer sharedLoggingRepository();
SHARE_EASYLOGGINGPP(sharedLoggingRepository())


extern std::vector<nmsp::Cont *> g_contp;

// ./libjd_plugin.so: undefined symbol: g_contp
// ./libqq_plugin.so: undefined symbol: g_contp
// 查了一些资料 extern 声明变量，不同定义，编译器不会分配内存给它。
// add_test 使用 -l add 加载动态库时候, 能找到 extern std::vector<int> g_i 的定义,
// 这里找不到 g_contp 定义,

// 
// extern nmsp::Cont *g_contp_arr[10];
// ./libjd_plugin.so: undefined symbol: g_contp_arr
//  ./libqq_plugin.so: undefined symbol: g_contp_arr
// 


// 原因是全局变量的符号没有导出, 在编译主程序时候使用 "-Wl,--export-dynamic" 导出即可,
// SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wl,-rpath=. -Wl,--export-dynamic")   # 全局变量符号导出, 一定要加上 "-Wl,--export-dynamic",


namespace nmsp
{
    Cont *ContCreate(PluginCallback pluginCb, const std::string &pattern, void *data)
    {
        return new Cont(pattern, pluginCb, data);
    }

    void ContDestroy(Cont *contp)
    {
        if (contp)
        {
            delete contp;
            contp = nullptr;
        }
    }

    int HttpHookAdd(enum HttpHookID hookId, Cont *contp)
    {
        if (HTTP_READ_REQUEST_HDR_HOOK == hookId)
        {
            g_contp.emplace_back(contp);

            // for (int i = 0; i < 10; ++i)
            // {
            //     if (nullptr == g_contp_arr[i])
            //     {
            //         g_contp_arr[i] = contp;
            //     }
            // }

            MYLOG("register %s", contp->GetPattern().c_str());
            return 0;
        }
        return -1;
    }
}